package com.ahora.org.ejb.dao.impl;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.ahora.org.ejb.dao.interfaces.ReporteDAO;
import com.ahora.org.ejb.dao.util.Util;
import com.ahora.org.ejb.jpa.beans.AgregarFechasDTO;
import com.ahora.org.ejb.jpa.beans.AreaReporteDTO;
import com.ahora.org.ejb.jpa.beans.TiempoDeRespuesta;
import com.ahora.org.ejb.jpa.entities.Area;
import com.ahora.org.ejb.jpa.entities.Expediente;
import com.ahora.org.ejb.jpa.entities.Fechas;
import com.ahora.org.ejb.jpa.entities.MovimientoExpediente;
import com.ahora.org.ejb.jpa.entities.Proceso;
import com.ahora.org.ejb.jpa.entities.Requisitos;
import com.ahora.org.ejb.jpa.entities.TipoDocumentosInternos;
import com.ahora.org.ejb.jpa.entities.Usuario;
@Stateless
public class ReporteDaoBean implements ReporteDAO{
	
	@PersistenceContext(name = "jpaConection")
	private EntityManager em;
	
	/*******************************************************************************************************************************/
	/******************************************************REPORTES*CON*SERVLET*****************************************************/
	/*******************************************************************************************************************************/
	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> listarUsuariosAll() {
		List<Usuario> lstUsuarios= new ArrayList<Usuario>();
		try {
			Query q = em.createQuery("Select p from Usuario p where p.idUsuario>2 and p.idEstado=1");
			if (q.getResultList().size()!=0) {
				lstUsuarios= q.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstUsuarios;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<TipoDocumentosInternos> listarTipoDocumentoIdentidad() {
		List<TipoDocumentosInternos> lstTipoDocumento= new ArrayList<TipoDocumentosInternos>();
		try {
			Query q = em.createQuery("Select p from TipoDocumentosInternos p where p.idEstado=1 order by p.idTipoDocumentoInternos asc");
			if (q.getResultList().size()!=0) {
				lstTipoDocumento= q.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstTipoDocumento;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Requisitos> listarRequisitosAll() {
		List<Requisitos> lstRequisitos = new ArrayList<Requisitos>();
		try {
			Query q = em.createQuery("Select p from Requisitos p where p.idEstado=1 order by p.idRequisito asc");
			if (q.getResultList().size()!=0) {
				lstRequisitos= q.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstRequisitos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<AgregarFechasDTO> listarFechasAll() {
		List<AgregarFechasDTO> lstAgregarFechas= new ArrayList<AgregarFechasDTO>();
		List<Fechas> lstFechas= new ArrayList<Fechas>();
		try {
			Query q = em.createQuery("Select p from Fechas p order by p.idMes,p.dia asc");
			if (q.getResultList().size()!=0) {
				lstFechas= q.getResultList();
				for (Fechas a : lstFechas) {
					AgregarFechasDTO bean= new AgregarFechasDTO();
					bean.setDia(a.getDia());
					bean.setEvento(a.getEvento());
					bean.setFecha(a.getFecha());
					bean.setIdmes(a.getIdMes());
					bean.setNommes(Util.retornarNombreMes(a.getIdMes()));
					lstAgregarFechas.add(bean);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstAgregarFechas;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<com.ahora.org.ejb.jpa.entities.Utilitarios> listarUtilitariosAll() {
		List<com.ahora.org.ejb.jpa.entities.Utilitarios> lstUtilitarios= new ArrayList<com.ahora.org.ejb.jpa.entities.Utilitarios>();
		try {
			Query q = em.createQuery("Select p from Utilitarios p");
			if (q.getResultList().size()!=0) {
				lstUtilitarios=q.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstUtilitarios;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<AreaReporteDTO> listarAreasAll() {
		List<AreaReporteDTO> lstAreas= new ArrayList<AreaReporteDTO>();
		List<Area> listaAreaBD= new ArrayList<Area>();
		try {
			Query q = em.createQuery("Select p from Area p where p.idEstado=1");
			if (q.getResultList().size()!=0) {
				listaAreaBD=q.getResultList();
				for (Area a : listaAreaBD) {
					AreaReporteDTO bean = new AreaReporteDTO();
					bean.setCodigo(a.getCodSubArea());
					bean.setNombreArea(a.getDescripcion());
					bean.setTipoArea(Util.retornarTipoDeArea(a.getIdTipArea()));
					lstAreas.add(bean);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstAreas;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MovimientoExpediente> listarPendientesAtender(Usuario objUsuario) {
		List<MovimientoExpediente> lstMovimiento = new ArrayList<MovimientoExpediente>();
		Query p=null;
		try {
			if (objUsuario.getTbRolUsuario().getIdRolUsuario()==3) {
				p = em.createQuery("Select p from MovimientoExpediente p where p.tbUsuarioDestinatario.tbArea.idAreaGen="
						+ objUsuario.getTbArea().getTbArea().getIdArea()+" and p.tbEstadoDestinatario.idEstadoDRE=1");
			}else if (objUsuario.getTbRolUsuario().getIdRolUsuario()==4) {
				p = em.createQuery("Select p from MovimientoExpediente p where p.tbEstadoDestinatario.idEstadoDRE=1");
			}
			 
			if (p.getResultList().size()!=0) {
				lstMovimiento = p.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstMovimiento;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MovimientoExpediente> listarCargaTrabajo(Usuario objUsuario) {
		List<MovimientoExpediente> lstCargaTrabajo= new ArrayList<MovimientoExpediente>();
		Query q=null;
		try {
			if (objUsuario.getTbRolUsuario().getIdRolUsuario()==3) {
				 q= em.createQuery("Select p from MovimientoExpediente p where p.tbUsuarioDestinatario.tbArea.idAreaGen="
						+ objUsuario.getTbArea().getTbArea().getIdArea()+" order by p.tbExpediente.idExpediente asc");
			}else if (objUsuario.getTbRolUsuario().getIdRolUsuario()==4) {
				 q = em.createQuery("Select p from MovimientoExpediente p order by p.tbExpediente.idExpediente asc");
			}
			
			if (q.getResultList().size()!=0) {
				lstCargaTrabajo=q.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstCargaTrabajo;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<TiempoDeRespuesta> listarTiempoRespuestaTecnicos(Usuario objUsuario) {
		List<TiempoDeRespuesta> lstTiempoRespuesta= new ArrayList<TiempoDeRespuesta>();
		TiempoDeRespuesta objTiempo= new TiempoDeRespuesta();
		List<MovimientoExpediente> lstMovimiento = new ArrayList<MovimientoExpediente>();
		Query q=null;
		try {
			if (objUsuario.getTbRolUsuario().getIdRolUsuario()==3) {
				 q = em.createQuery("Select p from MovimientoExpediente p where p.tbUsuarioDestinatario.tbArea.idAreaGen="
						+ objUsuario.getTbArea().getTbArea().getIdArea()+" order by p.tbExpediente.idExpediente asc");
			}else if (objUsuario.getTbRolUsuario().getIdRolUsuario()==4) {
				q = em.createQuery("Select p from MovimientoExpediente p  order by p.tbExpediente.idExpediente asc");
			}
			
			if (q.getResultList().size()!=0) {
				lstMovimiento= q.getResultList();
				for (MovimientoExpediente a : lstMovimiento) {
					objTiempo= new TiempoDeRespuesta();
					objTiempo.setCodigoExpediente(a.getTbExpediente().getCupex());
					objTiempo.setNombreProceso(a.getTbExpediente().getTbProceso().getNombreProceso());
					objTiempo.setNombreResponsable(a.getTbUsuarioDestinatario()
							.getNombres()
							+ " "
							+ a.getTbUsuarioDestinatario().getApellPater()
							+ " "
							+ a.getTbUsuarioDestinatario().getApellMater());
					objTiempo.setDuracion(a.getTbExpediente().getTbProceso().getDuracion());
					objTiempo.setTiempoRespuestaDias(fechasdiferenciaendias(a.getFechaRegistro(), a.getFechaDerivacion()));
					lstTiempoRespuesta.add(objTiempo);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstTiempoRespuesta;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Expediente> listarExpedientesAmiCargo(Usuario objUsuario) {
		List<Expediente> lstExpedientesCargo= new ArrayList<Expediente>();
		Query p=null;
		try {
			if (objUsuario.getTbRolUsuario().getIdRolUsuario()==3) {
				p = em.createQuery("Select p from Expediente p where p.tbProceso.tbArea.idAreaGen="+objUsuario.getTbArea().getIdArea());
			}else if (objUsuario.getTbRolUsuario().getIdRolUsuario()==4) {
				p = em.createQuery("Select p from Expediente p ");
			}
			 
			if (p.getResultList().size()!=0) {
				lstExpedientesCargo= p.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstExpedientesCargo;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Proceso> listarProcedimientosArea(Usuario objUsuario) {
		List<Proceso> lstProcedimientosArea= new ArrayList<Proceso>();
		Query p=null;
		try {
			if (objUsuario.getTbRolUsuario().getIdRolUsuario()==3) {
				p = em.createQuery("Select p from Proceso p where p.tbArea.idAreaGen="+objUsuario.getTbArea().getIdArea());
			}else if (objUsuario.getTbRolUsuario().getIdRolUsuario()==4) {
				p = em.createQuery("Select p from Proceso p ");
			}
			
			if (p.getResultList().size()!=0) {
				lstProcedimientosArea= p.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstProcedimientosArea;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MovimientoExpediente> listarExpedientesRecepcionados(
			Usuario objUsuario) {
		List<MovimientoExpediente> lstExpedientesRecepcionados= new ArrayList<MovimientoExpediente>();
		Query q=null;
		try {
			if (objUsuario.getTbRolUsuario().getIdRolUsuario()==2) {
				q= em.createQuery("Select p from MovimientoExpediente p where p.tbUsuarioDestinatario.tbArea.idArea="
						+ objUsuario.getTbArea().getIdArea()+" order by p.tbExpediente.idExpediente asc");
			}else if (objUsuario.getTbRolUsuario().getIdRolUsuario()==3) {
				q= em.createQuery("Select p from MovimientoExpediente p where p.tbUsuarioDestinatario.tbArea.idAreaGen="
						+ objUsuario.getTbArea().getTbArea().getIdArea()+" order by p.tbExpediente.idExpediente asc");
			}else if (objUsuario.getTbRolUsuario().getIdRolUsuario()==4) {
				q= em.createQuery("Select p from MovimientoExpediente p order by p.tbExpediente.idExpediente asc");
			}
			
			if (q.getResultList().size()!=0) {
				lstExpedientesRecepcionados= q.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstExpedientesRecepcionados;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MovimientoExpediente> listarExpedientesEnviados(
			Usuario objUsuario) {
		List<MovimientoExpediente> lstExpedientesEnviados = new ArrayList<MovimientoExpediente>();
		Query q = null;
		try {
			if (objUsuario.getTbRolUsuario().getIdRolUsuario() == 2) {
				q = em.createQuery("Select p from MovimientoExpediente p where p.tbUsuarioDestinatario.tbArea.idArea="
						+ objUsuario.getTbArea().getIdArea()
						+ " and p.tbUsuarioRemitente.idUsuario>2 order by p.tbExpediente.idExpediente asc");
			} else if (objUsuario.getTbRolUsuario().getIdRolUsuario() == 3) {
				q = em.createQuery("Select p from MovimientoExpediente p where p.tbUsuarioDestinatario.tbArea.idAreaGen="
						+ objUsuario.getTbArea().getTbArea().getIdArea()
						+ " and p.tbUsuarioRemitente.idUsuario>2 order by p.tbExpediente.idExpediente asc");
			} else if (objUsuario.getTbRolUsuario().getIdRolUsuario() == 4) {
				q = em.createQuery("Select p from MovimientoExpediente p where " +
						" p.tbUsuarioRemitente.idUsuario>2 order by p.tbExpediente.idExpediente asc");
			}

			if (q.getResultList().size() != 0) {
				lstExpedientesEnviados = q.getResultList();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lstExpedientesEnviados;
	}

	public int fechasdiferenciaendias(Date fechainicial, Date fechafinal) {
		DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
		String fechainiciostring = df.format(fechainicial);
		try {
			fechainicial = df.parse(fechainiciostring);
		} catch (ParseException ex) {
		}

		String fechafinalstring = df.format(fechafinal);
		try {
			fechafinal = df.parse(fechafinalstring);
		} catch (ParseException ex) {
		}

		long fechainicialms = fechainicial.getTime();
		long fechafinalms = fechafinal.getTime();
		long diferencia = fechafinalms - fechainicialms;
		double dias = Math.floor(diferencia / (1000 * 60 * 60 * 24));
		return ((int) dias);
	}

}
